﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractStudy
{
    //设计模式：模板设计模式


    /// <summary>
    /// 抽象父类
    /// </summary>
    public abstract class Generator
    {
        #region 构造函数
        public Generator()
        {

        }

        /// <summary>
        /// overLoad的带参构造函数
        /// </summary>
        /// <param name="dataBase"></param>
        /// <param name="pwd"></param>
        /// <param name="userName"></param>
        /// <param name="iP"></param>
        public Generator(string dataBase, string pwd, string userName, string iP)
        {
            DataBase = dataBase;
            Pwd = pwd;
            UserName = userName;
            IP = iP;
        }


        #endregion


        #region 公共属性
        //数据库名
        public string DataBase { get; set; }
        //密码
        public string Pwd { get; set; }
        //用户名
        public string UserName { get; set; }
        //服务器IP
        public string IP { get; set; }
        #endregion


        #region 公共方法
        /// <summary>
        /// 虚拟方法(子类中的查询操作都一样，如不一样可以重写)
        /// </summary>
        /// <returns></returns>
        public virtual string Query()
        {
            return $"生成查询数据的代码\n\r";
        }


        /// <summary>
        /// 虚拟方法(子类中的添加数据操作都一样，如不一样可以重写)
        /// </summary>
        /// <returns></returns>
        public virtual string Add()
        {
            return "生成添加数据的代码\n\r";
        }

        /// <summary>
        /// 虚拟方法(子类中的更新数据操作都一样)
        /// </summary>
        /// <returns></returns>
        public virtual string Update()
        {
            return "生成修改数据的代码\n\r";
        }

        /// <summary>
        /// 虚拟方法(子类共同的方法，都差不多)
        /// </summary>
        /// <returns></returns>
        public virtual string Delete()
        {
            return "生成删除数据的代码\n\r";
        }

        /// <summary>
        /// 执行生成
        /// </summary>
        /// <returns></returns>
        public virtual string Excute()
        {
            string queryCode = Query();
            string addCode = Add();
            string updateCode = Update();
            string deleteCode = Delete();   
            string pageListCode = PageList();
            string connectionCode = Connection();

            StringBuilder stringBuilder =new StringBuilder();
            stringBuilder.Append(queryCode);
            stringBuilder.Append(addCode);  
            stringBuilder.Append(updateCode);
            stringBuilder.Append(deleteCode);
            stringBuilder.Append(pageListCode);
            stringBuilder.Append(connectionCode);           

            return stringBuilder.ToString();
        }

        #endregion


        #region 抽象方法，子类独有
        /// <summary>
        /// 分页查询
        /// 抽象方法(只能子类实现、重写)
        /// </summary>
        /// <returns></returns>
        public abstract string PageList();


        /// <summary>
        /// 建立连接方法
        /// 抽象方法
        /// </summary>
        /// <returns></returns>
        public abstract string Connection();
        #endregion


    }

    #region MySql代码生成器类
    /// <summary>
    /// MySql的代码生成器
    /// </summary>
    public class MySqlGenerator : Generator
    {

        #region 构造函数
        public MySqlGenerator()
        {

        }


        /// <summary>
        /// overLoad一个带参构造函数
        /// 此构造函数继承父类的的构造函数，运行时会传参给父类构造函数，用父类构造函数来实例化对象
        /// </summary>
        /// <param name="database"></param>
        /// <param name="uername"></param>
        /// <param name="pwd"></param>
        /// <param name="ip"></param>
        public MySqlGenerator(string database, string uername, string pwd, string ip) : base(database, pwd, uername, ip)
        {

        }
        #endregion

        /// <summary>
        /// 重写抽象方法
        /// </summary>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public override string Connection()
        {
            return $"MySQL建立了连接...服务器: {this.IP},数据库:{this.DataBase},用户名:{UserName},密码:{this.Pwd} \n\r";
        }

        /// <summary>
        /// 重写抽象
        /// </summary>
        /// <returns></returns>
        public override string PageList()
        {
            return "MySql分页代码\n\r";
        }
    }
    #endregion


    #region SqlServer的代码生成器类
    /// <summary>
    /// SqlServer的代码生成器
    /// </summary>
    public class SqlServerGenerator : Generator
    {
        #region 构造函数
        public SqlServerGenerator()
        {

        }

        /// <summary>
        /// overLoad一个有参构造函数
        /// 通过base调用父类构造函数
        /// </summary>
        /// <param name="database"></param>
        /// <param name="username"></param>
        /// <param name="pwd"></param>
        /// <param name="ip"></param>
        public SqlServerGenerator(string database, string username, string pwd, string ip) : base(database, pwd, username, ip)
        {

        }
        #endregion


        /// <summary>
        /// 建立连接
        /// 重写抽象方法
        /// </summary>
        /// <returns></returns>
        public override string Connection()
        {
            return $"SqlServer建立了连接...服务器: {this.IP},数据库:{this.DataBase},用户名:{UserName},密码:{this.Pwd}\n\r";
        }


        /// <summary>
        ///分页
        ///override抽象方法
        /// </summary>
        /// <returns></returns>
        public override string PageList()
        {
            return "SqlServer分页代码\n\r";
        }
    }
    #endregion


    #region Orcale的代码生成器类
    public class OrcaleGenerator : Generator
    {
        #region 构造函数
        public OrcaleGenerator()
        {

        }


        /// <summary>
        /// 重载一个有参构造函数
        /// 该构造函数继承父类构造函数，并给父类构造函数传参
        /// </summary>
        /// <param name="database"></param>
        /// <param name="username"></param>
        /// <param name="pwd"></param>
        /// <param name="ip"></param>
        public OrcaleGenerator(string database, string username, string pwd, string ip) : base(database, pwd, username, ip)
        {

        }
        #endregion

        #region 重写抽象方法
        public override string PageList()
        {
            return "Orcale分页代码\n\r";
        }

        public override string Connection()
        {
            return $"Orcale建立了连接...服务器: {this.IP},数据库:{this.DataBase},用户名:{UserName},密码:{this.Pwd}\n\r";
        }
        #endregion



    }
    #endregion
}
